From 62c2a1d0989f67827868171e52ecd4b916a496b3 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Tue, 25 Jan 2011 18:06:53 +0000 Subject: [PATCH] libxl/xl: support empty disk paths (ejected cdroms) Support empty disk paths, including in domain config files, for compatibility with xend. This allows a domain to be created with a cdrom which is initially in the "ejected" (no cd present) state. Signed-off-by: Stefano Stabellini Acked-by: Ian Jackson Committed-by: Ian Jackson --- tools/libxl/libxl.c | 10 ++++++---- tools/libxl/libxl.h | 1 + tools/libxl/libxl_device.c | 2 ++ tools/libxl/xl_cmdimpl.c | 9 +++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index c4477c7c52..93a22d2024 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -646,8 +646,8 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event disk->backend_domid = 0; disk->domid = domid; - disk->physpath = NULL; - disk->phystype = 0; + disk->physpath = strdup(""); + disk->phystype = PHYSTYPE_EMPTY; /* this value is returned to the user: do not free right away */ disk->virtpath = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend)); disk->unpluggable = 1; @@ -882,6 +882,8 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis device.backend_kind = DEVICE_VBD; break; } + case PHYSTYPE_EMPTY: + break; case PHYSTYPE_FILE: /* let's pretend is tap:aio for the moment */ disk->phystype = PHYSTYPE_AIO; @@ -1606,7 +1608,7 @@ static unsigned int libxl_append_disk_list_of_type(libxl_ctx *ctx, pdisk->backend_domid = 0; pdisk->domid = domid; physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/params", be_path, *dir), &len); - if (strchr(physpath_tmp, ':')) { + if (physpath_tmp && strchr(physpath_tmp, ':')) { pdisk->physpath = strdup(strchr(physpath_tmp, ':') + 1); free(physpath_tmp); } else { @@ -1684,7 +1686,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk) if (!disk->physpath) { disk->physpath = strdup(""); - disk->phystype = PHYSTYPE_PHY; + disk->phystype = PHYSTYPE_EMPTY; } disks = libxl_device_disk_list(ctx, domid, &num); for (i = 0; i < num; i++) { diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index cf97b7c3b3..1160de3c8c 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -178,6 +178,7 @@ typedef enum { PHYSTYPE_AIO, PHYSTYPE_FILE, PHYSTYPE_PHY, + PHYSTYPE_EMPTY, } libxl_disk_phystype; typedef enum { diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 2d430b7ffe..cf694d2f82 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -130,6 +130,7 @@ char *libxl__device_disk_string_of_phystype(libxl_disk_phystype phystype) case PHYSTYPE_AIO: return "aio"; case PHYSTYPE_FILE: return "file"; case PHYSTYPE_PHY: return "phy"; + case PHYSTYPE_EMPTY: return "file"; default: return NULL; } } @@ -143,6 +144,7 @@ char *libxl__device_disk_backend_type_of_phystype(libxl_disk_phystype phystype) case PHYSTYPE_AIO: return "tap"; /* let's pretend file is tap:aio */ case PHYSTYPE_FILE: return "tap"; + case PHYSTYPE_EMPTY: return "tap"; case PHYSTYPE_PHY: return "phy"; default: return NULL; } diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 5f2cab299a..ba2bc29e4b 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -457,6 +457,11 @@ static int parse_disk_config(libxl_device_disk *disk, char *buf2) return 0; } tok = p + 1; + } else if (*p == ',') { + state = DSTATE_VIRTPATH; + disk->phystype = PHYSTYPE_EMPTY; + disk->physpath = strdup(""); + tok = p + 1; } break; case DSTATE_TAP: @@ -1834,8 +1839,8 @@ static void cd_insert(const char *dom, const char *virtdev, char *phys) libxl_string_to_phystype(&ctx, phys, &disk.phystype); } } else { - disk.physpath = NULL; - disk.phystype = 0; + disk.physpath = strdup(""); + disk.phystype = PHYSTYPE_EMPTY; } disk.virtpath = (char*)virtdev; disk.unpluggable = 1; -- 2.30.2